package com.eva.admin.biz.system;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.eva.admin.biz.system.dto.CreateSystemLocationDTO;
import com.eva.admin.biz.system.dto.UpdateSystemLocationDTO;
import com.eva.admin.dao.system.dto.QuerySystemLocationDTO;
import com.eva.dao.system.model.SystemLocation;
import com.eva.framework.common.model.PageData;
import com.eva.framework.common.model.PageWrap;
import com.eva.framework.common.utils.AssertUtil;
import com.eva.service.system.SystemLocationService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;

@Service
public class SystemLocationBiz {

    @Resource
    private SystemLocationService systemLocationService;

    /**
     * 创建
     *
     * @param dto 创建参数
     */
    @Transactional
    public void create(CreateSystemLocationDTO dto) {
        // 验证
        this.checkOpera(dto);
        // 构建对象
        SystemLocation newRecord = new SystemLocation();
        BeanUtils.copyProperties(dto, newRecord);
        // 执行创建
        systemLocationService.create(newRecord);
    }

    /**
     * 根据主键删除
     *
     * @param id 主键
     */
    @Transactional
    public void deleteById(Integer id) {
        AssertUtil.notEmpty(id, "主键不能为空");
        systemLocationService.deleteById(id, Boolean.TRUE);
    }

    /**
     * 根据主键批量删除
     *
     * @param ids 主键集合
     */
    @Transactional
    public void deleteByIdInBatch(List<Integer> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        for (Integer id : ids) {
            this.deleteById(id);
        }
    }

    /**
     * 修改
     *
     * @param dto 修改参数
     */
    public void updateById(UpdateSystemLocationDTO dto) {
        // 验证
        this.checkOpera(dto);
        // 构建对象
        SystemLocation newRecord = SystemLocation.builder().build();
        BeanUtils.copyProperties(dto, newRecord);
        // 执行修改
        systemLocationService.updateById(newRecord);
    }

    /**
     * 分页查询
     *
     * @param pageWrap 分页参数
     * @return 分页对象
     */
    public PageData<SystemLocation> findPage(PageWrap<QuerySystemLocationDTO> pageWrap) {
        QuerySystemLocationDTO queryDto = pageWrap.getModel();
        QueryWrapper<SystemLocation> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda()
                .eq(SystemLocation::getDisabled, Boolean.FALSE)
                .eq(queryDto.getParentId() != null, SystemLocation::getParentId, queryDto.getParentId())
                .eq(queryDto.getLevel() != null, SystemLocation::getLevel, queryDto.getLevel())
                .like(StringUtils.isNotBlank(queryDto.getName()), SystemLocation::getName, queryDto.getName())
                .like(StringUtils.isNotBlank(queryDto.getAreaCode()), SystemLocation::getAreaCode, queryDto.getAreaCode())
                .like(StringUtils.isNotBlank(queryDto.getPostalCode()), SystemLocation::getPostalCode, queryDto.getPostalCode())
        ;
        return systemLocationService.findPage(pageWrap.getPage(), pageWrap.getCapacity(), queryWrapper);
    }

    /**
     * 查询子地区
     *
     * @param parentId 父级地区ID
     * @return List<SystemLocation>
     */
    public List<SystemLocation> findChildren (Integer parentId) {
        SystemLocation queryDto = new SystemLocation();
        queryDto.setDisabled(Boolean.FALSE);
        // parentId为-1时视为查询省
        if (parentId == -1) {
            queryDto.setLevel((byte)1);
        }
        // 否则给定父级地区ID进行查询
        else {
            queryDto.setParentId(parentId);
        }
        return systemLocationService.findList(queryDto);
    }

    /**
     * 检查操作数据
     *
     * @param dto 操作数据
     */
    private void checkOpera(CreateSystemLocationDTO dto) {
        AssertUtil.notEmpty(dto.getShortName(), "简称不能为空");
        AssertUtil.notEmpty(dto.getName(), "名称不能为空");
        AssertUtil.notEmpty(dto.getFullName(), "全称不能为空");
        AssertUtil.notEmpty(dto.getLevel(), "层级不能为空");
        AssertUtil.notEmpty(dto.getPinyin(), "拼音不能为空");
        AssertUtil.notEmpty(dto.getAreaCode(), "区号不能为空");
        AssertUtil.notEmpty(dto.getPostalCode(), "邮编不能为空");
        AssertUtil.notEmpty(dto.getFirstLetter(), "首字母不能为空");
        AssertUtil.notEmpty(dto.getLng(), "经度不能为空");
        AssertUtil.notEmpty(dto.getLat(), "纬度不能为空");
    }
}
